#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2025/11/2 18:31
# @Author  : summer
# @Email   : 610658552@qq.com
# @File    : ser_wechat_openid.py
# @Software: PyCharm
# @Desc    : WechatOpenid序列化器（客户信息校验与格式处理）
import re
from rest_framework import serializers
from wechat.models import WechatOpenid


class WechatOpenidSerializer(serializers.ModelSerializer):
    """
    WechatOpenid序列化器：
    1. 校验手机号、Openid唯一性
    2. 手机号格式验证（11位数字）
    3. 新增/更新时必填字段校验
    """
    # 时间字段格式化（可读性更强）
    create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
    update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)

    class Meta:
        model = WechatOpenid
        fields = [
            "id", "wechat_name", "name", "phone", "openid",
            "description", "sort_num", "is_active",
            "create_time", "update_time"
        ]
        read_only_fields = ["id", "create_time", "update_time"]

    def validate_phone(self, value):
        """
        校验手机号：
        - 非空、11位数字
        - 全局唯一（排除已删除/压测数据）
        """
        value = value.strip()
        # 1. 非空校验
        if not value:
            raise serializers.ValidationError("手机号不能为空")
        # 2. 格式校验（11位数字）
        if not (value.isdigit() and len(value) == 11):
            raise serializers.ValidationError(f"手机号「{value}」格式错误，应为11位数字")
        # 3. 唯一性校验
        queryset = WechatOpenid.objects.filter(is_delete=0, pt_flag=0)
        if self.instance is None:  # 新增场景
            if queryset.filter(phone=value).exists():
                raise serializers.ValidationError(f"手机号「{value}」已关联客户信息，不可重复添加")
        else:  # 更新场景（排除当前实例）
            if queryset.exclude(id=self.instance.id).filter(phone=value).exists():
                raise serializers.ValidationError(f"手机号「{value}」已被其他客户使用，请更换")
        return value

    def validate_openid(self, value):
        """
        校验Openid：
        - 非空
        - 符合微信Openid格式（28位字母/数字/_/-）
        - 全局唯一（排除已删除/压测数据）
        """
        value = value.strip()
        # 1. 非空校验
        if not value:
            raise serializers.ValidationError("Openid不能为空")
        # 2. 格式校验（微信Openid通常为28位左右，支持字母、数字、_、-）
        if not re.match(r'^[a-zA-Z0-9_\-]{20,64}$', value):
            raise serializers.ValidationError("Openid格式错误，需为20-64位字母/数字/_/-")
        # 3. 唯一性校验
        queryset = WechatOpenid.objects.filter(is_delete=0, pt_flag=0)
        if self.instance is None:  # 新增场景
            if queryset.filter(openid=value).exists():
                raise serializers.ValidationError(f"Openid「{value}」已关联客户信息，不可重复添加")
        else:  # 更新场景（排除当前实例）
            if queryset.exclude(id=self.instance.id).filter(openid=value).exists():
                raise serializers.ValidationError(f"Openid「{value}」已被其他客户使用，请更换")
        return value

    def validate_wechat_name(self, value):
        """校验公众号名称非空"""
        value = value.strip()
        if not value:
            raise serializers.ValidationError("公众号名称不能为空")
        return value

    def validate(self, data):
        """新增场景必传字段校验（确保核心字段不缺失）"""
        if self.instance is None:  # 仅新增时校验
            required_fields = ["wechat_name", "phone", "openid"]
            missing_fields = [field for field in required_fields if field not in data]
            if missing_fields:
                raise serializers.ValidationError(f"缺少必填字段：{', '.join(missing_fields)}")
        return data